1 | 实验八 |
#贪心法迭代
1 | #include "stdafx.h" |
#贪心法 递归
每次递归,将问题的规模减少1~n,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "stdafx.h"
#include <iostream>
using namespace std;
//i是上一个符合条件的id,为了完整性,在第一列加上-1,n是总数目
void GetSet(int *si, int *fi, int i, int n)
{
int m = i + 1;
while (m <= n && si[m] < fi[i])//找第一个符合的
m = m + 1;
if (m <= n)
{
cout << m << "\t";
GetSet(si, fi, m, n);
}
}
int main()
{
int si[] = { -1,1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12 };
int fi[] = { -1,4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
int n = 11;
GetSet(si, fi, 0, 11);
}
#动态规划1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#include<iostream>
using namespace std;
//动态规划实现
int GetSet(int *start, int *finish, int n)
{
//c[i][j]表示第i个工作结束后到第j个工作开始前之间存在的可兼容的工作个数
//new c[i][j]
int **c = new int *[n];
for(int i=0; i<n; i++)
c[i] = new int[n];
//c[i][j]初始赋值
for(i=0; i<n; i++)
for(int j=0; j<n; j++)
c[i][j] = 0;
for(int j=0; j<n; j++)
{
for(i=0; i<n; i++)
{
if(i<j)
{
int s = finish[i];
int f = start[j];
for(int k=i+1; k<j; k++)
if(start[k]>=s && finish[k]<=f)
{
if(c[i][j]<(c[i][k]+c[k][j]+1))
c[i][j] = c[i][k]+c[k][j]+1; //分解成更小子问题
}
}
}
}
return c[0][n-1]; //最终目标
}
int main()
{
//已经按完成时间排好序
int start[] = {-1,3,0,5,3,5,6,8,8,2,1000};
int finish[] = {0,5,6,7,8,9,10,11,12,13,10000};
int n = 11; //活动只有9个
cout<<"最大兼容活动子集的大小为:"<<GetSet(start, finish, n)<<endl;
return 0;
}